Jak zavrit z programu modalni form, ktery je aktivni?

Otázka od: Ing. Marta Perglerová

15. 9. 2002 15:12

Mam nemodalni form. Z nej oteviram modalni form, ktery ma v OnActivate
nejaky kod, ktery
sve vysledky zobrazuje na ten modalni formular. Ja chci, aby po skonceni
tohoto kodu se tento modalni
form sam uzavrel a predal rizeni zpet tomu formu, ze ktereho byl vyvolan.
Jak to udelat?

Diky za navod.

Ing. Marta Perglerova

Odpovedá: Obermaier Petr Ing.

15. 9. 2002 16:47

> Od: Ing. Marta Perglerová [SMTP:marta.perglerova@seznam.cz]
> Mam nemodalni form. Z nej oteviram modalni form, ktery ma v OnActivate
> nejaky kod, ktery
> sve vysledky zobrazuje na ten modalni formular. Ja chci, aby po skonceni
> tohoto kodu se tento modalni
> form sam uzavrel a predal rizeni zpet tomu formu, ze ktereho byl vyvolan.
> Jak to udelat?
>
Nevim, jestli te spravne chapu, ale nestaci dat na konec toho nejakeho kodu
Close; ?

Ober

Odpovedá: Petr Vones

15. 9. 2002 15:51

From: "Obermaier Petr Ing." <Obermaier@mail.sdas.cz>
> Nevim, jestli te spravne chapu, ale nestaci dat na konec toho nejakeho kodu
> Close; ?

Ne v tomto pripade. Problem je chybne pouziti udalosti TForm.OnActivate ke
spusteni dane akce. Po skonceni teto udalosti je totiz do ModalResult
prirazena nula, takze jakykoli pokus o zavreni modalniho dialogu v teto
udalosti selze. Spravne reseni je pouzit uzivatelskou zpravu, tuto zaslat
asynchronne po zobrazeni dialogu a v obsluze te udalosti spustit dano akci:

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

const
  UM_AKCE = WM_USER + $1000;

type
  TForm2 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure FormShow(Sender: TObject);
  private
    procedure Akce;
    procedure UMAkce(var Msg: TMessage); message UM_AKCE;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.DFM}

{ TForm2 }

procedure TForm2.Akce;
var
  I: Integer;
begin
  for I := 1 to 1000 do
  begin
    Label1.Caption := IntToStr(I);
    Label1.Update;
  end;
  Close;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
  PostMessage(Handle, UM_AKCE, 0, 0);
end;

procedure TForm2.UMAkce(var Msg: TMessage);
begin
  Update;
  Akce;
end;

end.

Petr Vones